// 时间轮询分6个阶段去轮询 但是主要是三种,第一种是timer(setTimeout),第二种是api模块的调用,第三种是check(setImmediate)
//process.nextTick、Promise.resolve总是处在即将进入下一个阶段中被调用.


const { readFile } = require('fs');
const EventEmitter = require('events');

class EE extends EventEmitter { }

const yy = new EE()

yy.on('event', () => {
    console.log(`出大事了`)
})

setImmediate(() => {
    console.log(`immediate 立即回调`)
})

setTimeout(() => {
    console.log(`0毫秒到期执行的定时回调`);
    process.nextTick(() => {
        console.log(`进入下一个阶段哦`);
        setTimeout(() => {
            console.log(`我是第二次轮询中的setTimeout时刻-1`)
        }, 0)
    })
    Promise.resolve().then(
        () => {
            console.log(`我是promise仅次于process`)
        }
    )
    setTimeout(() => {
        console.log(`我是第二次轮询中的setTimeout时刻-2`)
    }, 0)


}, 0)

setTimeout(() => {
    console.log(`我是setTimeout阶段第二次被调用`)
}, 0)

setTimeout(() => {
    console.log(`我是setTimeout阶段第三次被调用`)
}, 0)

setTimeout(() => {
    console.log(`我是setTimeout阶段第四次被调用`)
}, 0)

setTimeout(() => {
    console.log(`100毫秒到期执行的定时回调`)
}, 100)

setTimeout(() => {
    console.log(`200毫秒到期执行的定时回调`)
}, 200)

readFile('../pachage.json', 'utf-8', data => {
    console.log(`完成文件 1 读操作的回调`)
})

readFile('../README.md', 'utf-8', data => {
    console.log(`完成文件 2 读操作的回调`)
})



process.nextTick(() => {
    setTimeout(() => {
        console.log(`我是setTimeout阶段第五次别调用`)
    }, 0)
    console.log(`process.nextTick的第一次回调`);
    process.nextTick(() => {
        console.log(`process.nextTick 的第二次回调`)
    })
})


Promise.resolve().then(
    () => {
        yy.emit('event');
        process.nextTick(() => {
            console.log(`process.nextTick 的第三次回调`)
        })
        console.log(`promise 的第一次回调`)
    }
).then(() => {
    console.log(`promise 的第 2 次回调`)
})

